package mainCNN;

import java.util.ArrayList;
import java.util.Iterator;

import util.PadraoTreinamento;
import util.Util;

public class CNN {
	private ArrayList<PadraoTreinamento> aPadraoTreinamento = null;
	
	public CNN(ArrayList<PadraoTreinamento> pPadraoTreinamento) {
		super();
		this.aPadraoTreinamento = pPadraoTreinamento;
	}
	
	public ArrayList<PadraoTreinamento> executar() {
		int i = 0;
		boolean isModificado = true;
		
		ArrayList<PadraoTreinamento> arrayTCNN = new ArrayList<PadraoTreinamento>();
		ArrayList<PadraoTreinamento> arrayT = aPadraoTreinamento;
		PadraoTreinamento padrao = null;
		
		arrayTCNN.add(aPadraoTreinamento.get(i));
		i++;
		
		
		while(isModificado) {
			isModificado = false;
			for(int k = 0; k < arrayT.size(); k++) {
				padrao = arrayT.get(k);
				boolean isMesmaClasse = this.classificar(padrao, arrayTCNN);
				if(!isMesmaClasse) {
					arrayTCNN.add(padrao);
					isModificado = true;
					break;
				}
			}
		}
			
	return arrayTCNN;
	}

	private boolean classificar(PadraoTreinamento pPadrao,ArrayList<PadraoTreinamento> pArrayTCNN) {
		Iterator<PadraoTreinamento> padroesTCNN = pArrayTCNN.iterator();
		Double distEuclidiana = null;
		double distMinima = 1000000;
		int idClasseMaisProxima = 10000;
		
		while(padroesTCNN.hasNext()) {
			PadraoTreinamento padraoTCNN = padroesTCNN.next();
			distEuclidiana = Util.getDistanciaEuclidiana(pPadrao, padraoTCNN);	
			
			if(distEuclidiana.doubleValue() < distMinima) {
				distMinima = distEuclidiana.doubleValue();
				idClasseMaisProxima = padraoTCNN.getClasse();
			}
		}
		
		if (pPadrao.getClasse() == idClasseMaisProxima) {
			return true;
		} else {
			return false;
		}
	}
	
	public double testar(ArrayList<PadraoTreinamento> pArrayTeste, ArrayList<PadraoTreinamento> pArrayTCNN) {
		Iterator<PadraoTreinamento> arrayTeste = pArrayTeste.iterator();
		Double distEuclidiana = null;
		double distMinima = 1000000;
		int idClasseMaisProxima = 10000;
		
		int certo = 0;
		int errado = 0;
		
		while (arrayTeste.hasNext()) {
			PadraoTreinamento padraoTeste = arrayTeste.next();
			
			distMinima = 100000;
			
			for (Iterator<PadraoTreinamento> itArrayTCNN = pArrayTCNN.iterator(); itArrayTCNN.hasNext();) {
				PadraoTreinamento padraoTCNN = itArrayTCNN.next();

				distEuclidiana = Util.getDistanciaEuclidiana(padraoTeste, padraoTCNN);	
					
					if(distEuclidiana.doubleValue() < distMinima) {
						distMinima = distEuclidiana.doubleValue();
						idClasseMaisProxima = padraoTCNN.getClasse();
					}
				}
			
			if(padraoTeste.getClasse() == idClasseMaisProxima) {
				certo++;
			} else {
				errado++;
			}	
		}
		System.out.println("Certo: " +certo+"\nErrado: "+errado+ "\nRes: "+ ((double)errado/(double) (certo+errado))*100+" \n");
				
		return 0;
		
	}
}
